package com.lqian;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * 注解是结合反射来运行的
 * 注解只是相当于一个标识，不做具体的操作，具体操作是由反射来完成的
 */
public class AnnotationTest {
    public static void main(String[] args) throws Exception {
        Class<Cat> catClass = Cat.class;
        //判断有没有@MyComponent注解
        MyComponent annotation = catClass.getAnnotation(MyComponent.class);
        if (annotation !=null){
            //创建对象
            Constructor<Cat> constructor = catClass.getConstructor();
            Cat cat = constructor.newInstance();

            // 注意：getFields()：获得某个类的所有的公共（public）的字段，包括父类中的字段。
            //      getDeclaredFields()：获得某个类的所有声明的字段，即包括public、private和proteced，但是不包括父类的申明字段。
            //
            // 同样类似的还有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods()
            // 这两者分别表示获取某个类的方法、构造函数。

            //开始赋值
            //得到catClass所有的字段
            Field[] declaredFields = catClass.getDeclaredFields();
            for (Field declaredField : declaredFields) {
                //判断有没有@MyValue注解
                MyValue valueAnnotation = declaredField.getAnnotation(MyValue.class);
                if (valueAnnotation != null){
                    //拿到注解上的值
                    String value = valueAnnotation.value();
                    //开启暴力反射访问设置权限
                    declaredField.setAccessible(true);
                    //判断属性的类型
                    if (declaredField.getType().getName() .equals("java.lang.Integer") ){
                        Integer val = Integer.parseInt(value);
                        declaredField.set(cat,val);
                    }else{
                        declaredField.set(cat,value);
                    }
                }
            }
            System.out.println(cat.toString());

        }else{
            System.out.println("无法创建对象");
        }
    }
}
